'''
@Company: TWL
@Author: xue jian
@Email: xuejian@kanzhun.com
@Date: 2020-07-30 08:45:08
'''
'''
343. 整数拆分
给定一个正整数 n，将其拆分为至少两个正整数的和，并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。

tips:dp[n]表示n能被分解的最大数，那么扫描[1, n]，有dp[n] = max(dp[n], j*dp[n-j])。这里注意一点，就是dp[n]中不包含
n本身，因为它至少被分解成两个数。而n在被其他用的时候，应该存在n这个数的。所以，dp[n] = max(dp[n], j*dp[n-j], j*(n-j))，
三个候选集放在一起比较才全面。代码如下：
'''

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [1]*(n+1)
        for i in range(n+1):
            for j in range(i):
                dp[i] = max(dp[i], j*dp[i-j], j*(i-j))
        return dp[-1]


if __name__ == "__main__":
    solution = Solution()
    n = 36
    print(solution.integerBreak(n))